home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Game-Power
/
Amiga Game-Power.iso
/
anwendungen
/
disk salv
/
fiveinline
/
fiveinline.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-20
|
10KB
|
500 lines
#include "exec/types.h"
#include "intuition/intuition.h"
#include "stdio.h"
#include "string.h"
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct RastPort *r,*r2;
struct Window *Wind,*abWind;
struct NewWindow NewWindow,NewWindow2;
struct IntuiMessage *mesg;
struct IntuiText prompt,yprompt,t0,t1;
struct Menu Menu1;
struct MenuItem m0,m1;
#define INTUITION_REV 29
#define GRAPHICS_REV 29
#define n 19
BOOL gamewon=FALSE,firstmove=TRUE;
USHORT mclass,mcode,msx,msy;
SHORT d,i,j,k,l,x,y,amx,amy,start;
SHORT lx,ly,pla,opp,x0,x1,y0,y1,max,value;
SHORT AttackFactor;
SHORT Board[n+1][n+1],Aline[4][n+1][n+1][2],Value[n+1][n+1][2];
int ov,xv,len;
char text[10];
static SHORT Weight[]={0,0,4,20,100,500,0};
VOID _main()
{
VOID OpenALL(),Human(),AddUp(),UpdateValue(),MakeMove(),FindMove();
VOID CreateMes(),DrawFrame(),make_window(),init_newgame();
VOID setup_menu(),show_About();
AttackFactor=4;
start=0;
OpenALL();
make_window();
setup_menu();
SetMenuStrip(Wind,&Menu1);
r=Wind->RPort;
CreateMes(&yprompt,3,3," OK ");
NewGame:
init_newgame();
if(start == 0) goto Human_first;
Loop:
pla=1;
opp=0;
FindMove();
MakeMove();
Board[x][y]=2;
if (! firstmove) {
SetAPen(r,0);
DrawFrame();
}
else firstmove=FALSE;
x0=(x-1)*20;
y0=(y-1)*8;
SetAPen(r,1);
Move(r,x0+14,y0+14);
Draw(r,x0+26,y0+18);
Move(r,x0+14,y0+18);
Draw(r,x0+26,y0+14);
amx=x0+13;
amy=y0+13;
SetAPen(r,3);
DrawFrame();
if (gamewon) {
ov=ov+1;
CreateMes(&prompt,50,5,"I won");
AutoRequest(Wind,&prompt,&yprompt,&yprompt,NULL,NULL,160,50);
goto NewGame;
}
Human_first:
pla=0;
opp=1;
Human();
MakeMove();
if (gamewon) {
xv=xv+1;
CreateMes(&prompt,37,5,"You won!");
AutoRequest(Wind,&prompt,&yprompt,&yprompt,NULL,NULL,160,50);
goto NewGame;
}
goto Loop;
}
VOID Human()
{
/* Set Up an IDCMP Read Loop */
HumanLoop:
Wait (1 << Wind->UserPort->mp_SigBit);
while((mesg=(struct IntuiMessage *) GetMsg(Wind->UserPort)) != NULL) {
mclass=mesg->Class;
mcode=mesg->Code;
msx=mesg->MouseX;
msy=mesg->MouseY;
ReplyMsg(mesg);
}
switch(mclass) {
case MENUPICK: {
if(ITEMNUM(mcode) == 0) {
ClearMenuStrip(Wind);
show_About();
while((mesg=(struct IntuiMessage *) GetMsg(Wind->UserPort)) != NULL) ReplyMsg(mesg);
SetMenuStrip(Wind,&Menu1);
goto HumanLoop;
}
else if(ITEMNUM(mcode) == 1) { /* Quit */
ClearMenuStrip(Wind);
CloseWindow(Wind);
exit(FALSE);
break;
}
else goto HumanLoop;
}
case MOUSEBUTTONS: {
if(ReadPixel(r,msx,msy) == 2) goto HumanLoop; /* black line */
if(msx < 10 || msx > 10+n*20) goto HumanLoop; /* outside board */
if(msy < 12 || msy > 12+n*8) goto HumanLoop; /* outside board */
y=((msy-12)/8)+1;
x=((msx-10)/20)+1;
if(Board[x][y] > 0) goto HumanLoop; /* occupied square */
Board[x][y]=1;
i=(x-1)*20+16;
j=y*8+6;
SetAPen(r,1);
Move(r,i+1,j);
Draw(r,i+6,j);
Move(r,i+7,j+1);
Draw(r,i+7,j+3);
Move(r,i+6,j+4);
Draw(r,i+1,j+4);
Move(r,i,j+3);
Draw(r,i,j+1);
}
}
}
VOID MakeMove()
{
gamewon=FALSE;
d=0;
for(k=0;k<=4;k++) {
x1=x-k;
y1=y;
if(x1>=1 && x1<=n-4) {
AddUp();
for(l=0;l<=4;l++)
UpdateValue();
}
}
d=1;
for(k=0;k<=4;k++) {
x1=x-k;
y1=y-k;
if((x1>=1 && x1<=n-4) && (y1>=1 && y1<=n-4)) {
AddUp();
for(l=0;l<=4;l++)
UpdateValue();
}
}
d=3;
for(k=0;k<=4;k++) {
x1=x+k;
y1=y-k;
if((x1>=5 && x1 <= n) && (y1>=1 && y1<=n-4)) {
AddUp();
for(l=0;l<=4;l++)
UpdateValue();
}
}
d=2;
for(k=0;k<=4;k++) {
x1=x;
y1=y-k;
if(y1>=1 && y1<=n-4) {
AddUp();
for(l=0;l<=4;l++)
UpdateValue();
}
}
}
VOID AddUp()
{
Aline[d][x1][y1][pla] = Aline[d][x1][y1][pla] + 1;
if(Aline[d][x1][y1][pla] == 5) gamewon=TRUE;
}
VOID UpdateValue()
{
if(d==0) {
lx=l;
ly=0;
}
else if(d==1) {
lx=l;
ly=l;
}
else if(d==2) {
lx=0;
ly=l;
}
else {
lx=-l;
ly=l;
}
if(Aline[d][x1][y1][opp] == 0) Value[x1+lx][y1+ly][pla] = Value[x1+lx][y1+ly][pla] + Weight[Aline[d][x1][y1][pla]+1] - Weight[Aline[d][x1][y1][pla]];
else if(Aline[d][x1][y1][pla] == 1) Value[x1+lx][y1+ly][opp] = Value[x1+lx][y1+ly][opp] - Weight[Aline[d][x1][y1][opp]+1];
}
VOID FindMove()
{
max=-32767;
x=(n+1)/2;
y=(n+1)/2;
if(Board[x][y] == 0) max=4;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
if(Board[i][j] == 0) {
value=Value[i][j][pla] * (16 + AttackFactor) / 16 + Value[i][j][opp];
if(value > max) {
x=i;
y=j;
max=value;
}
}
}
}
}
VOID OpenALL() /* Open required libraries */
{
IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",INTUITION_REV);
if(IntuitionBase == NULL) exit(FALSE);
GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",GRAPHICS_REV);
if(GfxBase == NULL) exit(FALSE);
}
VOID CreateMes(x,left,top,mes)
struct IntuiText *x;
SHORT left,top;
UBYTE *mes;
{
x->FrontPen=0;
x->BackPen=1;
x->DrawMode=JAM1;
x->LeftEdge=left;
x->TopEdge=top;
x->ITextFont=NULL;
x->IText=mes;
x->NextText=NULL;
}
VOID DrawFrame()
{
Move(r,amx,amy);
Draw(r,amx+14,amy);
Draw(r,amx+14,amy+6);
Draw(r,amx,amy+6);
Draw(r,amx,amy);
}
VOID make_window() /* Open a plain window */
{
NewWindow.LeftEdge=0;
NewWindow.TopEdge=0;
NewWindow.Width=480;
NewWindow.Height=170;
NewWindow.DetailPen=-1;
NewWindow.BlockPen=-1;
NewWindow.Title="Five In Line";
NewWindow.Flags=ACTIVATE|WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH;
NewWindow.IDCMPFlags=MOUSEBUTTONS|MENUPICK;
NewWindow.Type=WBENCHSCREEN;
NewWindow.FirstGadget=NULL;
NewWindow.CheckMark=NULL;
NewWindow.Screen=NULL;
NewWindow.BitMap=NULL;
NewWindow.MinWidth=0;
NewWindow.MinHeight=0;
NewWindow.MaxWidth=640;
NewWindow.MaxHeight=200;
Wind=(struct Window *) OpenWindow(&NewWindow);
}
VOID init_newgame()
{
start=1-start; /* toggle between computer and human */
for(x=1;x<=n;x++) {
for(y=1;y<=n;y++)
Board[x][y]=0;
}
for(d=0;d<=3;d++) {
for(x=1;x<=n;x++) {
for(y=1;y<=n;y++) {
for(pla=0;pla<=1;pla++)
Aline[d][x][y][pla]=0;
}
}
}
for(x=1;x<=n;x++) {
for(y=1;y<=n;y++) {
for(pla=0;pla<=1;pla++)
Value[x][y][pla]=0;
}
}
SetAPen(r,0);
RectFill(r,10,12,400,168); /* blank board */
firstmove=TRUE;
/* draw new grid */
SetAPen(r,2);
for(x=10;x<=10+n*20;x=x+20) {
Move(r,x,12);
Draw(r,x,12+n*8);
}
for(y=12;y<=12+n*8;y=y+8) {
Move(r,10,y);
Draw(r,10+n*20,y);
}
/* print scores */
SetAPen(r,1);
Move(r,420,30);
Text(r,"You:",4);
Move(r,450,30);
len=sprintf(text,"%3d",xv);
Text(r,text,len);
Move(r,420,45);
Text(r,"I :",4);
Move(r,450,45);
len=sprintf(text,"%3d",ov);
Text(r,text,len);
}
VOID setup_menu()
{
CreateMes(&t0,0,0,"About");
m0.NextItem=&m1;
m0.LeftEdge=5;
m0.TopEdge=0;
m0.Width=50;
m0.Height=10;
m0.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
m0.MutualExclude=NULL;
m0.ItemFill=(APTR)&t0;
m0.SelectFill=NULL;
m0.Command=NULL;
m0.SubItem=NULL;
CreateMes(&t1,0,0,"Quit");
m1.NextItem=NULL;
m1.LeftEdge=5;
m1.TopEdge=15;
m1.Width=50;
m1.Height=10;
m1.Flags=ITEMTEXT|HIGHCOMP|ITEMENABLED;
m1.MutualExclude=NULL;
m1.ItemFill=(APTR)&t1;
m1.SelectFill=NULL;
m1.Command=NULL;
m1.SubItem=NULL;
Menu1.NextMenu=NULL;
Menu1.LeftEdge=0;
Menu1.TopEdge=0;
Menu1.Width=60;
Menu1.Height=100;
Menu1.Flags=MENUENABLED;
Menu1.MenuName="Project";
Menu1.FirstItem=&m0;
}
VOID show_About()
{
NewWindow2.LeftEdge=Wind->LeftEdge + 40;
NewWindow2.TopEdge=Wind->TopEdge + 45;
NewWindow2.Width=400;
NewWindow2.Height=80;
NewWindow2.DetailPen=-1;
NewWindow2.BlockPen=-1;
NewWindow2.Title="About Five In Line";
NewWindow2.Flags=ACTIVATE|WINDOWCLOSE|SMART_REFRESH;
NewWindow2.IDCMPFlags=CLOSEWINDOW;
NewWindow2.Type=WBENCHSCREEN;
NewWindow2.FirstGadget=NULL;
NewWindow2.CheckMark=NULL;
NewWindow2.Screen=NULL;
NewWindow2.BitMap=NULL;
NewWindow2.MinWidth=0;
NewWindow2.MinHeight=0;
NewWindow2.MaxWidth=640;
NewWindow2.MaxHeight=200;
abWind=(struct Window *) OpenWindow(&NewWindow2);
r2=abWind->RPort;
SetAPen(r2,1);
Move(r2,10,20);
Text(r2,"Placed in Public Domain 1988",28);
Move(r2,10,30);
Text(r2,"by Njål Fisketjøn.",18);
Move(r2,10,50);
Text(r2,"Algorithm from a",16);
SetAPen(r2,3);
Move(r2,146,50);
Text(r2,"Borland Turbo Pascal",20);
SetAPen(r2,1);
Move(r2,314,50);
Text(r2,"program.",8);
Move(r2,10,70);
Text(r2,"Close window to continue playing.",33);
Wait (1 << abWind->UserPort->mp_SigBit);
while((mesg=(struct IntuiMessage *) GetMsg(abWind->UserPort)) != NULL) ReplyMsg(mesg);
CloseWindow(abWind);
}